home *** CD-ROM | disk | FTP | other *** search
/ The Business Master (4th Edition) / The Business Master - 4th Edition.iso / files / utilreen / booklet / chop50.asm < prev    next >
Assembly Source File  |  1987-09-26  |  11KB  |  324 lines

  1.           PAGE   80,132
  2.  TITLE Chop file into 50K chunks
  3. IF1
  4.           %OUT PASS1
  5. ENDIF
  6. IF2
  7.           %OUT PASS2
  8. ENDIF
  9. ;
  10. CHOP50   SEGMENT
  11.          ASSUME CS:CHOP50,DS:CHOP50,SS:CHOP50,ES:CHOP50
  12.           ORG    02H
  13. TOPMEM    DW     ?
  14.           ORG    82H
  15. PARM      DB     ?
  16.           ORG    100H
  17.  
  18. START:    JMP    REALSTART
  19.  
  20. HIMSG     DB     'CHOP50 v1.1',0DH,0AH
  21.           DB     '  Copyright 1987  Ronald Tansky',0DH,0AH,'$'
  22. BADFILE   DB     'COULD NOT OPEN INPUT FILE',0DH,0AH,'$'
  23. BADOUT    DB     'ERROR DURING WRITE',0DH,0AH,'$'
  24. BADSPACE  DB     'INSUFFICIENT DISK SPACE FOR WRITE',0DH,0AH,'$'
  25. BADMEM    DB     'INSUFFICIENT MEMORY- 64K minimum',0DH,0AH,'$'
  26. BADOUTF   DB     'ERROR OPENING OUTPUT FILE',0DH,0AH,'$'
  27. SUFFIX0   DB     '.000',0,0DH,0AH,'$'
  28.           EVEN
  29. HANDLE1   DW     ?
  30. HANDLE2   DW     ?
  31. ENDOUT    DW     ?               ; Pointer to trailing zero in FILENA2
  32. LASTNO    DW     ?               ; Pointer to last digit of FILENA2 suffix
  33. OUTLEN    DW     0               ; Length of output block
  34. OUTLEN2   DW     0               ; Length of output block beyond last CR
  35. OUT2POS   DW     0               ; Position of data in output block past last CR
  36. SAVEPOS   DW     FILENAME        ; Position to start copy for FILENA2
  37.           EVEN
  38. FILENAME  DB     80 DUP(?)
  39. FILENA2   DB     80 DUP(?)
  40. ;
  41. ; write opening message
  42. ;
  43. REALSTART:
  44.           MOV    DX,OFFSET HIMSG
  45.           MOV    AH,9
  46.           INT    21H
  47. ;
  48. ; check for enough memory
  49. ;
  50.           MOV    AX,TOPMEM
  51.           CMP    AX,4096         ; 64K available?
  52.           JAE    STPARSE         ;   yes, continue
  53.           JMP    NOMEM           ;   no, abend
  54. ;
  55. ; fix file name
  56. ;
  57. STPARSE:  CLD
  58.           CALL   PARSE1
  59.           MOV    AL,[FILENAME]
  60.           CMP    AL,0            ; null filename?
  61.           JNE    OPEN1           ;   no, open the file
  62.           JMP    BADINPUT        ;   yes, don't even try to run
  63. ;
  64. ; open input file
  65. ;
  66. OPEN1:    MOV    AH,3DH          ; DOS open-file request code
  67.           MOV    AL,40H          ; full-share, read-only
  68.           MOV    DX,OFFSET FILENAME
  69.           INT    21H
  70.           JNC    FILEOK
  71.           JMP    BADINPUT        ; if error, to to error routine
  72. FILEOK:   MOV    HANDLE1,AX      ; save file handle
  73.           MOV    BX,AX           ; put in BX, also, as req'd for read
  74. ;
  75. ; Open output file
  76. ;
  77.           CALL   BUMPFILE
  78.           MOV    AH,3CH          ; DOS create-file request code
  79.           MOV    CX,0            ; no special attributes
  80.           MOV    DX,OFFSET FILENA2
  81.           INT    21H
  82.           JNC    FILE2G1
  83.           JMP    BADOUTOP        ; if error, to to error routine
  84. FILE2G1:  MOV    HANDLE2,AX      ; save file handle
  85. ;
  86. ; MAIN LOOP: read 50K, write it
  87. ;
  88. READBLK:
  89.           MOV    AH,3FH          ; DOS request for read
  90.           MOV    CX,51200        ;   for 50K bytes
  91.           MOV    BX,HANDLE1      ;   from file using HANDLE1
  92.           MOV    DX,OFFSET IOAREA ;  into IOAREA
  93.           INT    21H
  94.           CMP    AX,0            ; EOF?
  95.           JE     CLOSE           ;   yes, close and end
  96.           CMP    CX,AX           ; full block read?
  97.           JNE    LASTBLK         ;   no, write out last block
  98.           MOV    AH,0BH          ; dummy KB check to allow DOS BREAK
  99.           INT    21H
  100. ; write the block
  101.           CALL   BRKBLK          ; try to break block at last CR
  102.           MOV    AH,40H          ; DOS request for write
  103.           MOV    CX,OUTLEN       ;   for about 50K bytes
  104.           MOV    BX,HANDLE2      ;   to file using HANDLE2
  105.           MOV    DX,OFFSET IOAREA ;  from IOAREA
  106.           INT    21H
  107.           JNC    WCOM2           ; if write good, continue to next
  108.           JMP    OUTERR
  109. WCOM2:    CMP    AX,CX           ; full block written?
  110.           JE     NEXT2           ;   yes
  111.           JMP    NODASD          ;   no, error
  112. ;
  113. ; close current output and open next
  114. ;
  115. NEXT2:
  116.           MOV    AH,3EH
  117.           INT    21H
  118.           CALL   BUMPFILE        ; increment file suffix
  119.           MOV    AH,3CH          ; DOS create-file request code
  120.           MOV    CX,0            ; no special attributes
  121.           MOV    DX,OFFSET FILENA2
  122.           INT    21H
  123.           JC     BADOUTOP        ; if error, to to error routine
  124. FILE2OK:  MOV    HANDLE2,AX      ; save file handle
  125.           MOV    AX,OUTLEN2
  126.           CMP    AX,0            ; ANY RESIDUAL BLOCK?
  127.           JE     NORESID
  128. ; Write residual data from last block
  129.           MOV    CX,AX
  130.           MOV    DX,OUT2POS
  131.           MOV    AH,40H          ; DOS request for write
  132.           MOV    BX,HANDLE2      ;   to file using HANDLE2
  133.           INT    21H
  134.           JNC    WCOM3           ; if write good, continue to next
  135.           JMP    OUTERR
  136. WCOM3:    CMP    AX,CX           ; full block written?
  137.           JE     NORESID         ;   yes
  138.           JMP    NODASD          ;   no, error
  139. NORESID:  JMP    READBLK
  140.  
  141.  
  142. LASTBLK:
  143.           MOV    CX,AX           ;   for length in AX
  144.           MOV    AH,40H          ; DOS request for write
  145.           MOV    BX,HANDLE2      ;   to file using HANDLE2
  146.           MOV    DX,OFFSET IOAREA ;   from IOAREA
  147.           INT    21H
  148.           JNC    WCOM4           ; if write good, continue to next
  149.           JMP    OUTERR
  150. WCOM4:    CMP    AX,CX           ; full block written?
  151.           JE     CLOSE           ;   yes
  152.           JMP    NODASD          ;   no, error
  153.  
  154. CLOSE:
  155.           MOV    BX,[HANDLE2]
  156.           MOV    AH,3EH
  157.           INT    21H
  158.           MOV    BX,[HANDLE1]
  159.           MOV    AH,3EH
  160.           INT    21H
  161.           MOV    AH,4CH
  162.           MOV    AL,0
  163.           INT    21H
  164.  
  165. ;
  166. ; error routines
  167. ;
  168. BADINPUT:                        ;   yes, or other error - end pgm
  169.           MOV    DX,OFFSET BADFILE
  170. RETBAD:   MOV    AH,9
  171.           INT    21H
  172.           MOV    AH,4CH
  173.           MOV    AL,8
  174.           INT    21H
  175. NODASD:   MOV    DX,OFFSET BADSPACE
  176.           JMP    RETBAD
  177. OUTERR:   MOV    DX,OFFSET BADOUT
  178.           JMP    RETBAD
  179. BADOUTOP: MOV    DX,OFFSET BADOUTF
  180.           JMP    RETBAD
  181. NOMEM:    MOV    DX,OFFSET BADMEM
  182.           JMP    RETBAD
  183.  
  184. ;
  185. ;  parse parm into filename
  186. ;    should be at least one non-blank character
  187. ;
  188. PARSE1    PROC
  189.           LEA    SI,PARM
  190. FINDBLNK: LODSB
  191.           CMP    AL,' '          ; leading blank?
  192.           JE     FINDBLNK        ;   yes, ignore
  193.           LEA    DI,FILENAME     ;   no, start moving file name
  194. LOOKCR:   CMP    AL,0DH          ; found CR yet?
  195.           JE     ENDFN           ;   yes, move zero to end
  196.           CMP    AL,' '          ; trailing blank?
  197.           JE     ENDFN           ;   yes, end scan
  198.           CMP    AL,":"          ; is it a colon?
  199.           JE     MARKPOS         ;   yes, mark this position
  200.           CMP    AL,"\"          ; is it a back slash?
  201.           JE     MARKPOS         ;   yes, mark this position
  202. NXTFN1:   STOSB                  ;   no, move byte to FILENAME field
  203.           LODSB
  204.           JMP    LOOKCR
  205.  
  206. MARKPOS:  MOV    SAVEPOS,DI
  207.           INC    SAVEPOS
  208.           JMP    NXTFN1
  209.  
  210. ENDFN:    MOV    BYTE PTR[DI],0
  211. ;
  212. ; scan input file, through end or first '.'
  213. ;   set suffix to '.000'
  214. ;
  215.           MOV    BL,':'          ; set default end-char
  216.           LEA    DI,FILENA2      ; set pointer to beginning of filename2
  217.           CMP    AL,0DH          ; any operand 2?
  218.           JNE    FINDB2          ;   maybe
  219.           JMP    NOOP2           ;   no, move op 1
  220. FINDB2:   LODSB
  221.           CMP    AL,' '          ; leading blank?
  222.           JE     FINDB2          ;   yes, ignore
  223. LOOKCR2:  CMP    AL,0DH          ; found CR yet?
  224.           JE     ENDOP2          ;   yes, move zero to end
  225.           CMP    AL,' '          ; trailing blank?
  226.           JE     ENDOP2          ;   yes, end scan
  227.           CMP    AL,'.'          ; final '.'?
  228.           JE     ENDOP2          ;   yes, end scan
  229.           STOSB
  230.           MOV    BL,AL           ; hold on to last good char
  231.           LODSB
  232.           JMP    LOOKCR2
  233. ENDOP2:   MOV    AL,BL
  234.           CMP    AL,':'          ; did it end with ":"?
  235.           JE     MOVEOP1         ;   yes, move entire operand 1
  236.           CMP    AL,'\'          ; did it end with "\"?
  237.           JE     MOVEOP1         ;   yes, move entire operand 1
  238.           JMP    ADDSUF          ;   no, just tack on suffix
  239. NOOP2:    MOV    DI,OFFSET FILENA2
  240. MOVEOP1:  MOV    SI,[SAVEPOS]
  241. FINDDOT:  LODSB
  242.           CMP    AL,0            ; end of filename?
  243.           JE     ADDSUF          ;   yes, add on the suffix
  244.           CMP    AL,'.'          ; start of suffix?
  245.           JE     ADDSUF          ;   yes, replace with '.000'
  246.           STOSB                  ;   no, move input char to output name
  247.           JMP    FINDDOT
  248. ADDSUF:   MOV    SI,OFFSET SUFFIX0
  249.           MOV    CX,8
  250.       REP MOVSB
  251.           SUB    DI,4
  252.           MOV    ENDOUT,DI       ; save pointer to trailing 0
  253.           DEC    DI
  254.           MOV    LASTNO,DI       ; save pointer to last digit
  255.           RET
  256. PARSE1    ENDP
  257.  
  258. ;
  259. ;  increment filename suffix by 1
  260. ;
  261. BUMPFILE  PROC
  262.           SUB    AX,AX
  263.           MOV    CX,3
  264.           MOV    BX,ENDOUT
  265.           MOV    SI,LASTNO
  266.           CLC
  267.           MOV    AL,[SI]
  268.           ADC    AL,1
  269.           JMP    SHORT AAA1
  270. ADDNEXT:  MOV    AL,[SI]
  271.           ADC    AL,0
  272. AAA1:     AAA
  273.           PUSHF
  274.           OR     AL,30H
  275.           POPF
  276.           MOV    BYTE PTR[SI],AL
  277.           DEC    SI
  278.           LOOP   ADDNEXT
  279.           MOV    BYTE PTR[BX],' '
  280.           MOV    AH,9
  281.           MOV    DX,OFFSET FILENA2
  282.           INT    21H             ; print name of output file
  283.           MOV    BYTE PTR[BX],0
  284.           RET
  285. BUMPFILE  ENDP
  286.  
  287. ;
  288. ;  trim block to last CR, if reasonable
  289. ;
  290. BRKBLK    PROC
  291.           MOV    CX,256          ; if no CR with 256 bytes, forget it
  292.           STD
  293.           MOV    SI,OFFSET IOAREA+51199  ; point to last byte of IOAREA
  294. FINDBK:   LODSB
  295.           CMP    AL,0DH          ; is it a CR?
  296.           JE     GOTBRK          ;   yes, handle it
  297.           CMP    AL,0AH          ; is it a LF?
  298.           JE     GOTBRK          ;   yes, handle it
  299.           LOOP   FINDBK          ;   no, try prev char
  300. ; no CR within 256 bytes.  set fields for full-length write
  301.           MOV    CX,51200
  302.           MOV    OUTLEN,CX
  303.           SUB    AX,AX
  304.           MOV    OUTLEN2,AX
  305.           JMP    BRKBLKR
  306. ; Found a CR, set new lengths
  307. GOTBRK:   MOV    BX,OFFSET IOAREA-2
  308.           MOV    AX,SI
  309.           SUB    AX,BX
  310.           MOV    OUTLEN,AX
  311.           MOV    AX,256
  312.           SUB    AX,CX
  313.           MOV    OUTLEN2,AX
  314.           INC    SI
  315.           INC    SI
  316.           MOV    OUT2POS,SI
  317. BRKBLKR:  CLD
  318.           RET
  319. BRKBLK    ENDP
  320.  
  321. IOAREA    DB     ?               ; IOAREA is 50K in size
  322. CHOP50    ENDS
  323.           END    START
  324.